#pragma once

#include<iostream>
#include<array>
#include<algorithm>
#include<stack>

using namespace std;

//direct insert sort
void direct_insert_sort(array<int, 10>&);

//shell sort
void shell_sort(array<int, 10>&);

//direct select sort
void direct_select_sort(array<int, 10>&);

//heap sort
void heap_sort(int(&)[10]);

//bubble sort
void bubble_sort(array<int, 10>&);

//quick sort
void quick_sort(array<int, 10>&arr, array<int, 10>::iterator begin, array<int, 10>::iterator end);
array<int, 10>::iterator partition(array<int, 10>& arr, array<int, 10>::iterator begin, array<int, 10>::iterator end);
void quick_sort_non_recursion(array<int, 10>& arr, array<int, 10>::iterator begin, array<int, 10>::iterator end);

//merger sort
void merge_sort(array<int, 10>& arr);
void merge(array<int, 10>& arr, array<int, 10>* temp, int left, int right);

//count sort
void count_sort(array<int, 10>& arr);

//display date
void display_date(array<int, 10>&);
void display_date_ordinary(int(&)[10]);

void test_direct_insert_sort(array<int, 10>&);

void test_shell_sort(array<int, 10>&);

void test_heap_sort(int(&)[10]);

void test_direct_select_sort(array<int, 10>&);

void test_bubble_sort(array<int, 10>&);

void test_quick_sort(array<int, 10>&);

void test_merge_sort(array<int, 10>&);

void test_quick_sort_non_recursion(array<int,10>&);

void test_count_sort(array<int, 10>&);